/*
Implementacja wyjscia loggera na konsole Windows NT / MS-DOS.
*/

#include <windows.h>
#include <time.h>

#include "ConsoleLogOutput.h"

namespace DarkStorm2D
{


	bool CConsoleLogOutput::Init()
	{
		AllocConsole();	//wymagane dla aplikacji GUI
		hOut = GetStdHandle(STD_OUTPUT_HANDLE);	//pobierz uchwyt konsoli
		//wypisz wiadomosc startowa
		
		std::stringstream buffer;	//bufor
		char timesign [128];	//bufor na date/czas
		
		_strdate(timesign);	//laduj date

		buffer <<"[Log otwarty o: " << timesign;	//pierwsza polowa informacji

		_strtime(timesign);	//laduj czas

		buffer <<" " << timesign <<"]\r\n";	//... druga polowa
		
		buffer <<"[======================================================]\r\n";
		buffer <<"[			  Jednostka Logujaca w konsoli				 ]\r\n";
		buffer <<"[======================================================]\r\n";
		
		Write(buffer.str(), LP_INFO);
				
		return true;	//sukces
	}

	bool CConsoleLogOutput::DeInit()
	{
		//wypisz wiadomosc
		std::stringstream buffer;
		char timesign [128];
		
		_strdate(timesign);

		buffer <<"[Log zamkniety o: " << timesign;

		_strtime(timesign);

		buffer <<" " << timesign <<"]\r\n";
		
		Write(buffer.str(), LP_INFO);

		return true;
	}
	
	void CConsoleLogOutput::Write(const std::string text, unsigned int priorityCode)
	{
		//wybierz kolor - wyjscie uzywa kolorow dla oznaczenia wagi wiadomosci
		
		//bialy dla normalnej informacji
		//niebieski dla debuggingowej informacji
		//zielony dla informacji o sukcesie
		//zolty dla ostrzezenia
		//czerwony dla bledu
		//czerwony na bialym tle dla bledu fatalnego
	
		switch(priorityCode)
		{
			case LP_INFO:
			{
				SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
				break;
			}

			case LP_SUCCESS:
			{
				SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
				break;
			}

			case LP_WARNING:
			{
				SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
				break;
			}

			case LP_ERROR:
			{
				SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
				break;
			}

			case LP_DEBUG:
			{
				SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
				break;
			}

			case LP_FATAL:
			{
//				SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY);
				SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
				break;
			}
			default:
			{
				SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
				break;
			}

		}
		DWORD dwTemp;
		WriteConsole(hOut, text.c_str(), text.size(), &dwTemp, NULL);
		return;
	
	}
	
} 
